package com.hua.designpattern.behavioral.visitor;

/**
 * 
 * @author joshua
 *
 *         <pre>
 *
 *  需要对一个对象结构中的对象进行很多不同的并且不相关的操作，而需要避免让这些操作"污染"这些对象的类，使用访问者模式将这些封装到类中。
 *      
 *	优点： 1、符合单一职责原则。 2、优秀的扩展性。 3、灵活性。
 *	缺点： 
 *		1、增加新的元素类很困难。在访问者模式中，每增加一个新的元素类都意味着要在抽象访问者角色中增加一个新的抽象操作，并在每一个具体访问者类中增加相应的具体操作，违背了“开闭原则”的要求。
 *		2、破坏封装。当采用访问者模式的时候，就会打破组合类的封装。
 *		3、比较难理解
 *
 *	在不确定的随时变换的调用时，可以采用访问者模式,如果可控的变化建议重构该类。
 *
 * 
 *         </pre>
 *
 */
public class TestVisitor {

	public static void main(String[] args) {
		ElementInterface elementConcrete1 = new ElementConcrete();

		VisitorInterface visitorConcrete1 = new VisitorConcrete1();
		VisitorInterface visitorConcrete2 = new VisitorConcrete2();

		// 直接调用该类的方法
		elementConcrete1.doSomething1();
		// 访问者调用方法
		elementConcrete1.accept(visitorConcrete1);
		// 访问者调用方法(重写访问者可以更改调用的方法，不用更改原类的代码)
		elementConcrete1.accept(visitorConcrete2);

	}

}
